﻿-- Function: getzone(text, smallint)

-- DROP FUNCTION getzone(text, smallint);

CREATE OR REPLACE FUNCTION getzone(IN gprefix text, IN tariff smallint, OUT id_zone integer)
  RETURNS integer AS
$BODY$
DECLARE
 normnumber text;
 prefix_temp text;
--- allprice real = 0; 
BEGIN
if tariff=1 then
select  destinations.destinationgroup_id  INTO id_zone from destinations
where destinations.prefix=gprefix;
else
select  destinations.tarif2 INTO id_zone from destinations
where destinations.prefix=gprefix;

end if;
return;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION getzone(text, smallint)
  OWNER TO atslog;

-- Function: isholyday(date)

-- DROP FUNCTION isholyday(date);

CREATE OR REPLACE FUNCTION isholyday(IN idate date, OUT result boolean)
  RETURNS boolean AS
$BODY$
DECLARE
idow INTEGER;
BEGIN
	result=FALSE;
	SELECT EXTRACT(DOW FROM idate) INTO idow;
	IF idow='0' OR idow='6'
	THEN 
		result=TRUE;
	ELSE
		IF NOT EXISTS(SELECT NULL FROM hollydays WHERE  date=idate) 
		THEN
			result=FALSE;
		ELSE
			result=TRUE;
		END IF;--idate;
	END IF;
	RETURN;

END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;
ALTER FUNCTION isholyday(date)
  OWNER TO atslog;
-- Function: pg_get_price(timestamp without time zone, timestamp without time zone, text, integer)

-- DROP FUNCTION pg_get_price(timestamp without time zone, timestamp without time zone, text, integer);

CREATE OR REPLACE FUNCTION pg_get_price(IN date_from timestamp without time zone, IN date_end timestamp without time zone, IN prefix_1 text, IN tarif integer, OUT allprice money)
  RETURNS money AS
$BODY$
DECLARE
 duration1 interval = '0';
 duration2 interval = '0';
 duration3 interval = '0';
 
 is_holyday bool = false;
 p_sec1 smallint =0;
 p_min1 smallint =0;
 p_hour1 smallint =0;
  p_sec2 smallint =0;
 p_min2 smallint =0;
 p_hour2 smallint =0;
  p_sec3 smallint =0;
 p_min3 smallint =0;
 p_hour3 smallint =0;
 price1 money =0;
 price2 money =0;
 price3 money =0;
 price4 money =0;
 --pricet money ;
--- allprice real = 0; 
BEGIN
-- определяем тип с чем работаем телефония или voip
allprice = 0;
  --считаем длительность разговора 
   duration1 = date_end-date_from;
	if duration1 > '0' --durnul
	then 
if tarif=1 then
	select destinationgroups.price1 ,
		destinationgroups.price2 ,
		destinationgroups.price3 ,
		destinationgroups.price4 INTO price1, price2, price3, price4
	 from destinations,destinationgroups 
		where 
			destinations.prefix=prefix_1
			AND destinationgroups.id=destinations.destinationgroup_id;
else
	select destinationgroups.price1 ,
		destinationgroups.price2 ,
		destinationgroups.price3 ,
		destinationgroups.price4 INTO price1, price2, price3, price4
	 from destinations,destinationgroups 
		where 
			destinations.prefix=prefix_1
			AND destinationgroups.id=destinations.tarif2;
end if;
--		p_sec = extract('second' FROM  duration); -- извлекаем секунды из интервала
--		p_min=extract('minute' FROM duration); -- извлекаем секунды из интервала
--		p_hour=extract('hour' FROM duration); -- извлекаем секунды из интервала
IF is_holyday=FALSE
then
if date_from::time between '08:00:00' AND '20:00:00'
	then 
		CASE 
		WHEN date_end::time between '20:00:00' AND '23:59:59'
			then	duration1='20:00:00'::time - date_from::time;
				duration2=date_end::time - '20:00:00'::time;
				duration3='0';
		WHEN date_end::time between '00:00:00' AND '08:00:00'
			then	duration1='20:00:00'::time - date_from::time;
				duration2='23:59:59'::time - '20:00:00'::time+'00:00:01'::time;
				duration3=date_end::time - '00:00:00'::time;
		else 	duration1=date_end::time - date_from::time;
			duration2='0';
			duration3='0';
		END CASE;
		p_sec1 = extract('second' FROM  duration1); -- извлекаем секунды из интервала
		p_min1=extract('minute' FROM duration1); -- извлекаем секунды из интервала
		p_hour1=extract('hour' FROM duration1); -- извлекаем секунды из интервала
		p_sec2 = extract('second' FROM  duration2); -- извлекаем секунды из интервала
		p_min2=extract('minute' FROM duration2); -- извлекаем секунды из интервала
		p_hour2=extract('hour' FROM duration2); -- извлекаем секунды из интервала
		p_sec3 = extract('second' FROM  duration3); -- извлекаем секунды из интервала
		p_min3=extract('minute' FROM duration3); -- извлекаем секунды из интервала
		p_hour3=extract('hour' FROM duration3); -- извлекаем секунды из интервала
		allprice=allprice+p_sec1*(price1/60)+p_sec2*(price2/60)+p_sec3*(price3/60); -- считаем цену за секунды
		allprice=allprice+p_min1*price1+(p_hour1*60)*price1+p_min2*price2+(p_hour2*60)*price2+p_min3*price3+(p_hour3*60)*price3;
--		allprice=0;
elsif date_from::time between '00:00:00' AND '08:00:00'
	then
		CASE 
		WHEN date_end::time between '08:00:00' AND '20:00:00'
			then	duration3='08:00:00'::time - date_from::time;
				duration1=date_end::time - '08:00:00'::time;
				duration2='0';
		WHEN date_end::time between '20:00:00' AND '23:59:59'
			then	duration3='08:00:00'::time - date_from::time;
				duration1='20:00:00'::time - '08:00:00'::time;
				duration2=date_end::time - '23:59:59'::time-'00:00:01'::time;
		else 	duration3=date_end::time - date_from::time;
			duration2='0';
			duration1='0';
		END CASE;
		p_sec1 = extract('second' FROM  duration1); -- извлекаем секунды из интервала
		p_min1=extract('minute' FROM duration1); -- извлекаем секунды из интервала
		p_hour1=extract('hour' FROM duration1); -- извлекаем секунды из интервала
		p_sec2 = extract('second' FROM  duration2); -- извлекаем секунды из интервала
		p_min2=extract('minute' FROM duration2); -- извлекаем секунды из интервала
		p_hour2=extract('hour' FROM duration2); -- извлекаем секунды из интервала
		p_sec3 = extract('second' FROM  duration3); -- извлекаем секунды из интервала
		p_min3=extract('minute' FROM duration3); -- извлекаем секунды из интервала
		p_hour3=extract('hour' FROM duration3); -- извлекаем секунды из интервала
		
		allprice=allprice+p_sec1*(price1/60)+p_sec2*(price2/60)+p_sec3*(price3/60); -- считаем цену за секунды
		allprice=allprice+p_min1*price1+(p_hour1*60)*price1+p_min2*price2+(p_hour2*60)*price2+p_min3*price3+(p_hour3*60)*price3;
		allprice=0;
else
		CASE 
		WHEN date_end::time between '00:00:00' AND '08:00:00'
			then	duration2='23:59:59'::time - date_from::time+'00:00:01'::time;
				duration3=date_end::time - '00:00:00'::time;
				duration1='0';
		WHEN date_end::time between '08:00:00' AND '20:00:00'
			then	duration2='08:00:00'::time - date_from::time;
				duration3='08:00:00'::time - '00:00:00'::time;
				duration1=date_end::time - '20:00:00'::time;
		else 	duration2=date_end::time - date_from::time;
			duration1='0';
			duration3='0';
		END CASE;
		p_sec1 = extract('second' FROM  duration1); -- извлекаем секунды из интервала
		p_min1=extract('minute' FROM duration1); -- извлекаем секунды из интервала
		p_hour1=extract('hour' FROM duration1); -- извлекаем секунды из интервала
		p_sec2 = extract('second' FROM  duration2); -- извлекаем секунды из интервала
		p_min2=extract('minute' FROM duration2); -- извлекаем секунды из интервала
		p_hour2=extract('hour' FROM duration2); -- извлекаем секунды из интервала
		p_sec3 = extract('second' FROM  duration3); -- извлекаем секунды из интервала
		p_min3=extract('minute' FROM duration3); -- извлекаем секунды из интервала
		p_hour3=extract('hour' FROM duration3); -- извлекаем секунды из интервала
		
		allprice=allprice+p_sec1*(price1/60)+p_sec2*(price2/60)+p_sec3*(price3/60); -- считаем цену за секунды
		allprice=allprice+p_min1*price1+(p_hour1*60)*price1+p_min2*price2+(p_hour2*60)*price2+p_min3*price3+(p_hour3*60)*price3;
	--	allprice=p_min2::numeric::money;
	end IF;
else
	duration1=date_end::time - date_from::time;
	p_sec1 = extract('second' FROM  duration1); -- извлекаем секунды из интервала
	p_min1=extract('minute' FROM duration1); -- извлекаем секунды из интервала
	p_hour1=extract('hour' FROM duration1); -- извлекаем секунды из интервала
	allprice=allprice+p_sec1*(price4/60); -- считаем цену за секунды
	allprice=allprice+p_min1*price4;
END IF;	
End IF;

  RETURN ;
--EXCEPTION
--WHEN OTHERS THEN
--  status_code := 'Unexpected error: ' || SQLERRM;
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE
  COST 100;
ALTER FUNCTION pg_get_price(timestamp without time zone, timestamp without time zone, text, integer)
  OWNER TO atslog;
-- Function: pg_prefix(text)

-- DROP FUNCTION pg_prefix(text);

CREATE OR REPLACE FUNCTION pg_prefix(IN telnumber text, OUT prefix text)
  RETURNS text AS
$BODY$
DECLARE
 normnumber text;
 prefix_temp text;
--- allprice real = 0; 
BEGIN
-- определяем тип с чем работаем телефония или voip
IF telnumber LIKE '810%'
then
normnumber=regexp_replace(telnumber,'^[810]{3}','');
elsif telnumber NOT LIKE '8%' 
then 
normnumber=telnumber;
else
normnumber=regexp_replace(telnumber,'^[8]{1}','7');
end if;
IF character_length(normnumber)>'9'
then
SELECT p.prefix::text INTO prefix
from destinations AS p 
WHERE p.prefix  in (
regexp_replace(normnumber,'[0-9]{13}$',''),
regexp_replace(normnumber,'[0-9]{12}$',''),
regexp_replace(normnumber,'[0-9]{11}$',''),
regexp_replace(normnumber,'[0-9]{10}$',''),
regexp_replace(normnumber,'[0-9]{9}$',''),
regexp_replace(normnumber,'[0-9]{8}$',''),
regexp_replace(normnumber,'[0-9]{7}$',''),
regexp_replace(normnumber,'[0-9]{6}$',''),
regexp_replace(normnumber,'[0-9]{5}$','')
--AND character_length(normnumber)>'9' 
--regexp_replace(numbertodial,'[0-9]{5}$','')
)
order by length(p.prefix) desc limit 1 ;
end if;
--prefix=prefix_temp;
 RETURN ;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION pg_prefix(text)
  OWNER TO atslog;
